﻿#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

void Swap(int* n1, int * n2){
    int tmp = *n2;
    *n2 = *n1;
    *n1 = tmp;
}

void printNums(int * nums, int size) {
    printf("\nThe nums is : ");
    for(int i = 0; i < size; i++)
        printf(" %d ", nums[i]);
    printf("\n");
}

int removeElement(int* nums, int numsSize, int val) {
    if(numsSize == 1)   // 边界值处理
        return nums[0] == val ? 0 : 1;
    
    int begin = 0;
    int end = numsSize -1;
    int valCount = 0;   // 统计删除的元素个数
    while(end - begin > 0){
        // 找到最后一个不等 val 的元素
        while(end >= 0 && nums[end] == val) {
            --end;
            valCount++;
        }
        // 找到第一个等于 val 的元素
        while(begin < end) {
            if(nums[begin] != val)
                ++begin;
            else {
                valCount++;
                break;
            }
        }
        // 交换
        if(end > begin) {
            Swap(&nums[begin], &nums[end]);
            --end;
            ++begin;
        }
        // 边界值处理
        if(end == begin && nums[begin] == val)
            valCount++;
    }

    printNums(nums, numsSize);

    return numsSize - valCount;
}

int main() {
    // 特殊 [1,1] 1; [2,2,3] 2; [1] 1 
    int nums[] = {0,1,2,2,3,0,4,2};
    int numsSize = sizeof(nums) / sizeof(int);
    int target = 2;
    int len = removeElement(nums, numsSize, target);
    printf("The nums len --- %d \n", len);
    return 0;
}